//
//  GLASDK.h
//  GLASDK_Overseas
//
//  Created by geekluo on 2022/6/22.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import "GLASDK.h"
#import "GLAResponseModel.h"
#import "GLAConstant.h"
#import "GLARoleInfo.h"


NS_ASSUME_NONNULL_BEGIN

@protocol GLASDKDelegate <NSObject>

-(void)callBack:(GLAEventType)type Info:(id)info;

@end

@interface GLASDK : NSObject

#pragma mark ---------- init&configure ----------

+ (GLASDK *)shareInstance;

/**
 *  初始化SDK
 *   @param delegate  回调代理
 */

- (void)SDKInit:(id<GLASDKDelegate>)delegate;

/**
 *   活动网页 safari打开
 */
- (void)SDKEventWeb:(NSString *)url DEPRECATED_MSG_ATTRIBUTE("此方法已过期，请使用openWebView");

/**
 * 打开H5网页
 * 支持JS交互、SDK参数获取、自带导航栏
 */
- (void)openH5Link:(NSString *)url DEPRECATED_MSG_ATTRIBUTE("此方法已过期，请使用openWebView");

/**
 *  打开H5网页,支持JS交互（推荐使用）
 *  @param url  需要打开的url链接
 *  @param isFullScreen  是否全屏显示（隐藏导航栏及状态栏）
*/
- (void)openH5Link:(NSString *)url
      isFullScreen:(BOOL)isFullScreen DEPRECATED_MSG_ATTRIBUTE("此方法已过期，请使用openWebView");

/**
 *  打开H5网页,支持JS交互
 *  @param url  需要打开的url链接
 *  @param isFullScreen  是否全屏显示（隐藏导航栏及状态栏）
 *  @param callback webview回调，包含关闭
*/
- (void)openH5Link:(NSString *)url isFullScreen:(BOOL)isFullScreen callback:(webviewCallback)callback DEPRECATED_MSG_ATTRIBUTE("此方法已过期，请使用openWebView");

/**
 *  打开H5网页（通用方法，推荐使用）
 *  @param url  需要打开的url链接(需要拼接configParams参数)
*/
- (void)openWebView:(NSString *)url;

/**
 *  打开H5网页（通用方法，推荐使用）
 *  @param url  需要打开的url链接(需要拼接configParams参数)
 *  @param callback webview回调，包含关闭

*/
- (void)openWebView:(NSString *)url callback:(webviewCallback)callback;


/**
 *  打开协议
 *  @param policyType   1：用户协议 2 ：隐私协议 
 */
- (void)showPrivacyPolicyView:(NSInteger)policyType;

/**
 * 请求苹果评星弹窗
 * 注意：此API单设备一年内限制调用三次，玩家可在设置内主动关闭，也无法弹出
 */
- (void)requestRateView;

/**
 *  facebook分享链接
 *  @param urlString   链接字符串
 *  @param handle          分享回调
*/
- (void)FBShareWithURL:(NSString *)urlString
       compationhandle:(shareBlock)handle;

/**
 *  facebook分享链接
 *  @param urlString   链接字符串
 *  @param quote            分享文本,未安装Facebook，网页分享时此参数无效
 *  @param handle          分享回调
*/
- (void)FBShareWithURL:(NSString *)urlString
                 quote:(NSString *)quote
       compationhandle:(shareBlock)handle;

/**
 *  facebook分享图片
 *  注意：必须安装Facebook APP才可分享图片
 *  @param image            image对象
 *  @param handle          分享回调
*/
- (void)FBShareWithImage:(UIImage *)image
         compationhandle:(shareBlock)handle;

/**
 *  facebook Messenger分享链接
 *  注意：需要安装MessengerAPP才能分享成功
 *  @param urlString   链接字符串
 *  @param handle          分享回调
*/
- (void)FBMessengerShareWithURL:(NSString *)urlString
               compationhandle:(shareBlock)handle;

/**
 *  facebook Messenger分享图片
 *  注意：需要安装MessengerAPP才能分享成功
 *  @param image            image对象
 *  @param handle          分享回调
*/
- (void)FBMessengerShareWithImage:(UIImage *)image
                 compationhandle:(shareBlock)handle;



/**
 *  开启推送功能
 *  须按文档进行相关配置
 */
- (void)openPushNotification DEPRECATED_MSG_ATTRIBUTE("此方法已过期，请使用infoplist中的Q1_OPENPUSH配置代替，此接口将于近期移除");

/**
 *  回调注册通知的deviceToken
 *  @param deviceToken
 *  appdelegate中回调的推送设备token参数
 *  application:didRegisterForRemoteNotificationsWithDeviceToken:
*/
- (void)pushNotiDeviceToken:(NSData *)deviceToken;

/**
 *  游戏触发的强更弹窗
 *  @param urlString  商店地址
 *  @param closeAble  弹窗是否允许关闭
*/
- (void)showUpdateDialogWithUrl:(NSString *)urlString
                      closeAble:(BOOL)closeAble;

#pragma mark ------- 测试用接口 --------

- (void)changeUuid:(NSString *)uuid;

#pragma mark --------------------接口透传（无界面）---------------------

/**
 *   游客登录
 *   @param block  返回数据
 */
- (void)guestLogin:(ResponseBlock)block;

/**
*   自动登录  session自动刷新，返回最新session
*   @param block  返回数据
*/
- (void)getLatestSession:(ResponseBlock)block;

/**
*   使用上次登录方式登录,session刷新失败时调用
*   @param block  返回数据
*/
- (void)loginWithLatestLoginPlatform:(ResponseBlock)block;

/**
 *   登出账号
 *   退出Facebook和Google的登录账号
 */
- (void)logoutAll;


#pragma mark -------- Apple 登录相关 -------

/**
 *  AppleSignin登录
 *  @param block  返回数据
 */
- (void)AppleLogin:(ResponseBlock)block;

/**
 *  Apple绑定
 *  @param block  返回数据
 */
- (void)AppleBind:(ResponseBlock)block;


#pragma mark ------ Facebook登录相关 --------
/**
 *  facebook登录
 *  @param block  返回数据
 */
- (void)FacebookLogin:(ResponseBlock)block;

/**
 *  切换账号前调用(清除fb账号缓存)
 */
- (void)Facebooklogout;

/**
 *  facebook绑定
 *  @param block  返回数据
 */
- (void)FacebookBind:(ResponseBlock)block;


#pragma mark --------- 推特登录相关 -----------


/// 推特登录
/// - Parameter block: 返回数据
-(void)TwitterV2Login:(ResponseBlock)block;

/// 推特绑定
/// - Parameter block: 返回数据
-(void)TwitterV2Bind:(ResponseBlock)block;

#pragma mark --------- google登录相关 ------------

/// Google登录
/// - Parameter block: 返回数据
-(void)GoogleLogin:(ResponseBlock)block;

/// Google绑定
/// - Parameter block: 返回数据
-(void)GoogleBind:(ResponseBlock)block;

/// Google登出
-(void)GoogleLogout;

#pragma mark --------- 邮箱登录相关 -----------
/**
 *  Email查询已绑定状态
 *  @param mail  邮箱地址（必传）
 *  @param type  发送类型（必传）
 *  @param block  返回数据
 */
- (void)emailQueryBind:(NSString *)mail
              sendType:(GLAEmailType)type
                block:(ResponseBlock)block;

/**
 *  Email查询绑定状态并发送验证码
 *  @param mail  邮箱地址（必传）
 *  @param type  发送类型（必传）
 *  @param block  返回数据
 */
- (void)emailQueryBindAndSending:(NSString *)mail
                   sendType:(GLAEmailType)type
                      block:(ResponseBlock)block;
/**
 *  Email发送验证码
 *  @param mail  邮箱地址（必传）
 *  @param type  发送类型（必传）
 *  @param block  返回数据
 */
- (void)emailSending:(NSString *)mail
           sendType:(GLAEmailType)type
              block:(ResponseBlock)block;

/**
 *  Email登录
 *  @param mail  邮箱地址（必传）
 *  @param captcha  验证码（必传）
 *  @param block  返回数据
 */
- (void)emailLogin:(NSString *)mail
           captcha:(NSString *)captcha
             block:(ResponseBlock)block;


/**
 *  旧Email校验
 *  @param mail  邮箱地址（必传）
 *  @param captcha  验证码（必传）
 *  @param block  返回数据
 */
- (void)emailCheck:(NSString *)mail
           captcha:(NSString *)captcha
             block:(ResponseBlock)block;


/**
 *  Email绑定/换绑定
 *  @param mail  邮箱地址（必传）
 *  @param type  发送类型（必传）
 *  @param captcha  验证码（必传）
 *  @param block  返回数据
 */
- (void)emailBinding:(NSString *)mail
           sendType:(GLAEmailType)type
            captcha:(NSString *)captcha
              block:(ResponseBlock)block;


/**
 *  解绑
 *  @param block  返回数据
 */
- (void)unBinding:(GLALoginType)platform block:(ResponseBlock)block;

#pragma mark --------------------支付---------------------

/**
 *  是否是美国商店用户
 *   Storefront>product
 */
- (void)getRegionCodeWithProductId:(nullable NSString *)productId
                        completion:(void (^)(NSString * _Nullable regionCode))completion;

/**
 *  获取当前用户国家地区代码
 *   Storefront>product
 */
- (void)isUSUserWithProductId:(nullable NSString *)productId
                   completion:(void (^)(BOOL isUS))completion;

/**
 *  支付接口
 *
 *  @param productIdentifiers     内购产品ID
 *  @param actorId                              角色ID
 *  @param serverId                           区服ID
 *  @param userId                               用户ID
 *  @param payNum                               购买金额（基准金额）
 *  @param orderItem                         订单明细: 1*100*1*大礼包*ProductId  商品ID*单价（分）*数量*商品名称，总长度限制32个字节
 *  @param orderNO                             订单号
 *  @param currencyType                  货币符号（基准货币符号）
 *  @param orderSign                        订单签名: MD5(OrderItem + OrderNO + PayNum + UserID + buyKey)
 *  @param developerPayload        游戏透传额外参数
 *  @param notifyUrl                       新增,支付回调url
 */
- (void)IAP_ProductId:(NSString *)productIdentifiers
              actorId:(NSString *)actorId
             serverId:(NSString *)serverId
               userId:(NSString *)userId
               payNum:(NSString *)payNum
            orderItem:(NSString *)orderItem
              orderNO:(NSString *)orderNO
         currencyType:(NSString *)currencyType
            orderSign:(NSString *)orderSign
     developerPayload:(NSString *)developerPayload
            notifyUrl:(NSString *)notifyUrl;

/**
 *  订阅接口
 *
 *  @param productIdentifiers     内购产品ID
 *  @param actorId                              角色ID
 *  @param serverId                           区服ID
 *  @param userId                               用户ID
 *  @param payNum                               购买金额（基准金额）
 *  @param orderItem                         订单明细: 1*100*1*大礼包*ProductId  商品ID*单价（分）*数量*商品名称，总长度限制32个字节
 *  @param orderNO                             订单号
 *  @param currencyType                  货币符号（基准货币符号）
 *  @param orderSign                        订单签名: MD5(OrderItem + OrderNO + PayNum + UserID + buyKey)
 *  @param developerPayload        游戏透传额外参数
 *  @param notifyUrl                       新增,支付回调url
 */
- (void)IAP_SubIAPProductId:(NSString *)productIdentifiers
                    actorId:(NSString *)actorId
                   serverId:(NSString *)serverId
                     userId:(NSString *)userId
                     payNum:(NSString *)payNum
                  orderItem:(NSString *)orderItem
                    orderNO:(NSString *)orderNO
               currencyType:(NSString *)currencyType
                  orderSign:(NSString *)orderSign
           developerPayload:(NSString *)developerPayload
                  notifyUrl:(NSString *)notifyUrl;

#pragma mark --------------------事件上报---------------------

/**
 *  开始更新
 *  @brief  游戏开始更新资源时上报
 */
- (void)trackUpdateBegin;

/**
 *  更新完成
 *  @brief  游戏更新资源完成后上报
 */
- (void)trackUpdateEnd;

/**
 *  更新失败
 *  @brief  游戏更新资源完成后上报
 *  @param  msg    非必传      错误原因，格式:msg=reason,如网络错误：msg=网络错误
 */
- (void)trackUpdateError:(NSString *)msg;

/**
 * 用户校验成功
 * @brief  在游戏校验session成功之后调用
 * @param serverId     必传        服务器id
 * @param userId         必传            用户id
 * @param roleId         必传        角色id
 * @param roleName    非必传        角色名
 * @param roleLevel  非必传        角色等级
 */
- (void)trackUserLogin:(NSString *)serverId
                userId:(NSString *)userId
                roleId:(NSString *)roleId
              roleName:(NSString *)roleName
             roleLevel:(NSString *)roleLevel;

/**
 * 用户校验失败
 * @brief  在游戏校验session失败时调用
 * @param serverId     必传      服务器id
 * @param userId          必传         用户id
 * @param roleId          必传      角色id
 * @param roleName     非必传      角色名
 * @param roleLevel   非必传      角色等级
 * @param msg                非必传      错误原因，格式:msg=reason,如网络错误：msg=网络错误
 */
- (void)trackUserLoginError:(NSString *)serverId
                     userId:(NSString *)userId
                     roleId:(NSString *)roleId
                   roleName:(NSString *)roleName
                  roleLevel:(NSString *)roleLevel
                        msg:(NSString *)msg;
/**
 * 选择服务器
 * @brief 用户登录成功，选择服务器时上报
 * @param serverId      必传        服务器id
 * @param userId          必传         用户id
 * @param roleId          必传     角色id
 * @param roleName     非必传      角色名
 * @param roleLevel   非必传      角色等级
 */
- (void)trackSelectServer:(NSString *)serverId
                   userId:(NSString *)userId
                   roleId:(NSString *)roleId
                 roleName:(NSString *)roleName
                roleLevel:(NSString *)roleLevel;

/**
 * 创建角色
 * @brief 创建角色时上报
 * @param serverId      必传        服务器id
 * @param userId          必传         用户id
 * @param roleId          必传     角色id
 * @param roleName     非必传      角色名
 * @param roleLevel   非必传      角色等级
 */
- (void)trackCreateRole:(NSString *)serverId
                 userId:(NSString *)userId
                 roleId:(NSString *)roleId
               roleName:(NSString *)roleName
              roleLevel:(NSString *)roleLevel;

/**
 * 角色登录
 * @brief 游戏角色登录时上报，新创建角色登录也应上报登录事件
 * @param serverId      必传        服务器id
 * @param userId          必传         用户id
 * @param roleId          必传         角色id
 * @param roleName    非必传          角色名
 * @param roleLevel   非必传      角色等级
 */
- (void)trackRoleLogin:(NSString *)serverId
                userId:(NSString *)userId
                roleId:(NSString *)roleId
              roleName:(NSString *)roleName
             roleLevel:(NSString *)roleLevel;

/**
 * 角色登录失败
 * @brief  在游戏校验session失败时调用
 * @param serverId     必传      服务器id
 * @param userId          必传         用户id
 * @param roleId          必传      角色id
 * @param roleName     非必传      角色名
 * @param roleLevel   非必传      角色等级
 * @param msg                非必传      错误原因，格式:msg=reason,如网络错误：msg=网络错误
 */
- (void)trackRoleLoginError:(NSString *)serverId
                     userId:(NSString *)userId
                     roleId:(NSString *)roleId
                   roleName:(NSString *)roleName
                  roleLevel:(NSString *)roleLevel
                        msg:(NSString *)msg;


/**
 * 角色下线、退出登录
 * @brief 游戏角色下线、退出登录时上报，会停止角色在线时长计算并上报
 * @param serverId      必传        服务器id
 * @param userId          必传         用户id
 * @param roleId          必传         角色id
 * @param roleName     非必传          角色名
 * @param roleLevel   非必传      角色等级
 */
- (void)trackRoleLogout:(NSString *)serverId
                 userId:(NSString *)userId
                 roleId:(NSString *)roleId
               roleName:(NSString *)roleName
              roleLevel:(NSString *)roleLevel;

/**
 * 角色升级
 * @brief 游戏角色升级时上报
 * @param serverId      必传        服务器id
 * @param userId          必传         用户id
 * @param roleId          必传         角色id
 * @param roleName     非必传         角色名
 * @param roleLevel   非必传         角色等级
 */
- (void)trackLevelUp:(NSString *)serverId
              userId:(NSString *)userId
              roleId:(NSString *)roleId
            roleName:(NSString *)roleName
           roleLevel:(NSString *)roleLevel;

/**
 *  启动日志
 *  @param action    动作：updateEnd，updateError，openSDK
 *  @param msg       上报消息(根据需求定义)：ver=2018042501;update=100%
 */
- (void)SDKEventReport:(NSString *)action
                   msg:(NSString * __nullable)msg;

/**
 *  登录日志，有用户角色信息的调用是事件，如：创建角色，登录进入游戏，SDK账号验证成功
 *  @param action     事件类型
 *  @param serverId   服务器id
 *  @param actorId     角色ID
 *  @param actorName  角色名称
 *  @param actorLevel 角色等级
 *  @param user       用户名或userid(通过session从服务器取)
 *  @param msg        如：skin=red;eye=cockeye(根据需求定义)
 */
- (void)SDKEvent:(NSString *)action
        serverID:(NSString *)serverId
         actorId:(NSString *)actorId
       actorName:(NSString *)actorName
      actorLevel:(NSString *)actorLevel
            user:(NSString *)user
             msg:(NSString * __nullable)msg;

/**
 *  新启动事件上报
 *  @brief 启动到用户登录之间的上报事件，这时还没有用户
 *  @param action   动作
 *  @param extraDic    字典
*/
- (void)trackStartEvent:(NSString *)action
               extraDic:(NSDictionary *)extraDic;


/**
 *  新用户事件上报
 *  @brief 启动到用户登录之间的上报事件，这时还没有用户
 *  @param action   动作
 *  @param roleInfo   角色信息
 *  @param extraDic    字典
*/
- (void)trackUserEvent:(NSString *)action
             roleInfo:(GLARoleInfo *)roleInfo
             extraDic:(NSDictionary *)extraDic;

#pragma mark --------------------基础数据---------------------

/// 游戏版本号
- (NSString *)shortVersion;

/**
 * 获取AppId
*/
- (NSString *)GetAppId;

/// 渠道ID
- (NSString *)GetPID;

/// 设备唯一ID（UUID）
- (NSString *)GetUUID;

/// Radid  已废弃,无法获取
- (NSString *)GetRadid API_DEPRECATED("Not Available", ios(2.0, 11.0));

/// Rsid  已废弃,无法获取
- (NSString *)GetRsid API_DEPRECATED("Not Available", ios(2.0, 11.0));

/// 获取APPID
- (NSString *)GetAppId;

/// 获取APPKEY
- (NSString *)GetAppKey;

/**
 * 获取配置扩展参数  jsonString格式
 * 在SDK后台配置扩展参数，由SDK获取后，游戏可在SDK初始化成功后从此接口获取
+ * needRealTime: 是否需要实时数据，yes:一定要获取到线上最新数据才返回，否则返回空，NO:直接返回缓存数据
*/
- (NSString *)getExtParams:(BOOL)needRealTime;

/**
 * 获取SDK后台配置参数
 */
- (NSString *)getConfigValueForKey:(NSString *)key;
#pragma mark --------------------无UI参数---------------------
//获取userid
- (NSString *)getUserId;

//获取是否有第二次登录
- (BOOL)isSecondLogin;

//是否支持Apple登录 （iOS 13及以上）
- (BOOL)isSupportAppleSignin;

//最近登录账号平台
- (GLALoginType)getLatestLoginPlatform;

//最近登录账号信息
- (NSDictionary *)lastLoginUser;

//最近登录账号信息
- (GLAUser *)currentUser;

/// 是否开启多语言提示SDK弹窗
-(void)showLocalizedMessageEnable:(BOOL)enable;

// 注销账号方法
- (void)logoutAccountAction;

#pragma mark --------------------Debug Mode---------------------

/**
 *  打开Debug模式
 *  @param viewController    当前顶层VC，可传空
 */
-(void)showDebugModeWithViewController:(UIViewController *)viewController;

//清除登录缓存
- (void)clearAccountCache;

- (void)getProductID:(NSArray *)productIDS;

- (void)purchaseProduct:(NSString *)product accountToken:(NSString *)accountToken;

- (void)requestProductSucc;

- (void)requestProductFail;

- (void)Purchase;

- (void)payCrash;

-(void)sendMessage:(GLAEventType)type info:(id)info;
#pragma mark --------------------选择图片---------------------
/**
 * 上传图片
 * @param appid           游戏appid
 * @param pid             游戏pid
 * @param serverId        游戏区服
 * @param actorId         角色id
 * @param actorName       角色名字
 * @param limitMemorySize 图片压缩大小，单位MB
 * @param imageId         自定义ImageId
 */
- (void)uploadImage:(NSString *)appid
                pid:(NSString *)pid
           serverId:(NSString *)serverId
            actorId:(NSString *)actorId
          actorName:(NSString *)actorName
    limitMemorySize:(int)limitMemorySize
            imageId:(NSString *)imageId;

/**
 * 上传图片
 * @param appid           游戏appid
 * @param pid             游戏pid
 * @param serverId        游戏区服
 * @param actorId         角色id
 * @param actorName       角色名字
 * @param limitMemorySizeKB 图片压缩大小，单位KB
 * @param imageId         自定义ImageId
 * @param editAble       是否允许裁剪
 * @param callback        上传图片回调，成功/失败；图片链接,具体返回数据参见：<ImageUploadResult>
 */
- (void)uploadImage:(NSString *)appid
                pid:(NSString *)pid
           serverId:(NSString *)serverId
            actorId:(NSString *)actorId
          actorName:(NSString *)actorName
  limitMemorySizeKB:(int)limitMemorySizeKB
            imageId:(NSString *)imageId
           editAble:(BOOL)editAble
           callback:(ImageUploadResultBack)callback;

/**
 * 获取审核状态
 * @param imageId         自定义ImageId
 */
- (void)getImageReviewStatus:(NSString *)imageId
                   callback:(ImageStatusResultBack)callback;


#pragma mark --------------------隐私&合规---------------------

/**
 *  拉起用户Q1隐私协议
 *  @param isExit  点击拒绝时是否退出应用  YES：退出游戏  NO：不退出游戏
 *  @param callBack  隐私状态回调
 */
- (void)showPrivacyWithQ1SDK:(BOOL)isExit
               callBack:(agreeComplianceCallback)callBack;


#pragma mark --------------------冰川欧洲CMP---------------------

/**
 *  拉起冰川CMP弹窗
 *  仅欧洲包，不接入变现SDK（ADMOB）时使用，接入admob时使用UMP
 *  @param callBack  隐私状态回调  see:GLACMPResult
 */
- (void)showBCCMPCallBack:(BCEUCMPCallback)callBack;

/**
 *  是否可欧洲包
 *  是否必须：否
 *  欧洲包在plist内配置字段
 *  @return YES:是欧洲包  NO：不时欧洲包
 */
- (BOOL)isEuPackage;

/**
 *  是否可以弹出表单(欧洲CMP)
 *  是否必须：否
 *  仅欧洲包，不接入变现SDK（ADMOB）时使用，接入admob时使用UMP
 *  @return YES:可以再次弹出  NO：不可再次弹出(非欧洲地区)
 */
- (BOOL)isEuPrivacySettingsButtonEnabled;

/**
 * 接口用途：再次弹出表单供用户更改意见(欧洲CMP)
 * 是否必须：否
 */
- (void)showEuPrivacyOptionsForm;


#pragma mark --------------------推送相关---------------------

/**
 * 设置消息推送权限开启/关闭
 */
- (void)openAppSetting;

/**
 * 获取消息推送权限状态
 * @param callback    消息回调
 */
- (void)getPushNotifiState:(CallBackPushNotifiState)callback;

/**
 * 获取推送token
 */
- (NSString *)apnsDeviceToken;

@end

NS_ASSUME_NONNULL_END
